
/**
 * \file Zone.h
 * \brief Module pour gérer les zones
 * \author Carrillon Sovanna
 * \version 1.0
 * \date mai 2011
 */



#ifndef ZONE_H
#define ZONE_H

#include <stdlib.h>
#include <stdbool.h>

#include "BlocObjet.h"


/**
  * \struct Zone
  * \brief les zones sont des tableaux de BlocObjet et sont connectées les unes aux autres
  * Si par exemple une connexion vers le nord n'existe pas, num_zone_nord contiendra -1.
  */
struct sZone
    {
    	/** tableau [dimension][dimension] de blocs */
        BlocObjet** tab;
        /** dimension du tableau précédent */
        int dimension;
        /* ////////////////////////////////////////////////////////////////////////////////////////////////////////////////à utiliser !!!!*/
        int num_zone;
        /** numéro de la zone se trouvant au nord */
        int num_zone_nord;
        /** numéro de la zone se trouvant au sud*/
        int num_zone_sud;
        /** numéro de la zone se trouvant à l'est */
        int num_zone_est;
        /** numéro de la zone se trouvant à l'ouest */
        int num_zone_ouest;
		/** nombres de monstres à placement aléatoire affectés à la zone */
        int nb_monstres_aleatoires;
    };
/** \typedef renommage de sZone en Zone */
typedef struct sZone Zone;



/**
  * \brief Initialisation d'une zone à partir d'un fichier
  * \param [in,out] p_zone : pointeur sur la zone à initialiser
  * \param [in] num_zone : numéro de la zone à initialiser, c'est aussi le nom du fichier qui va servir à l'initialisation
  */
void zonInit (Zone* p_zone, int num_zone);

/**
  * \brief Libération d'une zone
  * \param [in,out] p_zone : pointeur sur la zone à libérer
  */
void zonLibere (Zone* p_zone);

/**
  * \brief Crée une zone
  * \param [in] num_zone : numéro de la zone à créer, c'est aussi le nom du fichier qui contient les informations sur cette zone
  * \return pointeur sur une zone allouée dans le tas
  */
Zone* zonCree (int num_zone);

/**
  * \brief Détruit une zone
  * \param [in,out] p_zone : pointeur sur la zone à détruire
  */
void zonDetruit (Zone* p_zone);




/**
  * \brief Renvoie le nombre de monstres placés aléatoirement sur la zone
  * \param [in] p_zone : pointeur sur zone
  * \return nombre de monstres placés aléatoirement sur cette zone
  */
int zonGetNbMonstresAleatoires(const Zone* p_zone);



/**
  * \brief Renvoie un pointeur sur le BlocObjet situé aux coordonées (x,y)
  * \param [in] p_zone : pointeur sur zone
  * \param [in] x : entier < dimension de la zone
  * \param [in] y : entier < dimension de la zone
  * \return pointeur sur BlocObjet
  */
BlocObjet* zonGetPBlocObjetXY(const Zone* p_zone, int x, int y);

/**
  * \brief Renvoie le Bloc situé aux coordonées (x,y)
  * \param [in] p_zone : pointeur sur zone
  * \param [in] x : entier < dimension de la zone
  * \param [in] y : entier < dimension de la zone
  * \return un Bloc
  */
Bloc zonGetBlocXY (const Zone* p_zone, int x, int y);

/**
  * \brief Renvoie l'Objet situé aux coordonées (x,y)
  * \param [in] p_zone : pointeur sur zone
  * \param [in] x : entier < dimension de la zone
  * \param [in] y : entier < dimension de la zone
  * \return un Objet
  */
Objet zonGetObjetXY(const Zone* p_zone, int x, int y);



/**
  * \brief Renvoie Vrai si le BlocObjet aux coordonées (x,y) est accessible, Faux sinon
  * \param [in] p_zone : pointeur sur zone
  * \param [in] x : entier < dimension de la zone
  * \param [in] y : entier < dimension de la zone
  * \return Vrai ou Faux
  */
bool zonEstPositionAccessible (const Zone* p_zone, int x, int y);

/**
  * \brief Renvoie Vrai si le BlocObjet aux coordonées (x,y) permet de changer de zone, Faux sinon
  * \param [in] p_zone : pointeur sur zone
  * \param [in] x : entier < dimension de la zone
  * \param [in] y : entier < dimension de la zone
  * \return Vrai ou Faux
  */
bool zonEstChangeurZone (const Zone* p_zone, int x, int y);




/**
  * \brief Renvoie le numéro de la zone se trouvant au Nord
  * \param [in] p_zone : pointeur sur zone
  * \return numéro de zone
  */
int zonGetNumZoneNord(Zone* p_zone);

/**
  * \brief Renvoie le numéro de la zone se trouvant au Sud
  * \param [in] p_zone : pointeur sur zone
  * \return numéro de zone
  */
int zonGetNumZoneSud(Zone* p_zone);

/**
  * \brief Renvoie le numéro de la zone se trouvant à l'Est
  * \param [in] p_zone : pointeur sur zone
  * \return numéro de zone
  */
int zonGetNumZoneEst(Zone* p_zone);

/**
  * \brief Renvoie le numéro de la zone se trouvant à l'Ouest
  * \param [in] p_zone : pointeur sur zone
  * \return numéro de zone
  */
int zonGetNumZoneOuest(Zone* p_zone);


/**
  * \brief Change la dimension d'une zone
  * \param [in,out] p_zone : pointeur sur zone
  * \param [in] dim : entier : nouvelle dimension de la zone
  */
void zonSetDimension(Zone* p_zone, int dim);

/**
  * \brief Renvoie la dimension d'une zone
  * \param [in] p_zone : pointeur sur zone
  * \return entier : taille de la zone
  */
int zonGetDimension(const Zone* p_zone);




/**
  * \brief Lance le test de toutes les fonctions du module
  * \return Vrai si tout s'est bien passé
  */
bool zonTestRegression();

#endif /* ZONE_H */
